import java.util.Scanner;

/**
 * Created whit IntelliJ IDEA.
 * Description：
 * User：ZHONGCHEN
 * Date:2022-03-26
 * Time:13:12
 */
public class TestDemo {
    //质数因子的个数
    //从最小因子2到数字的最大因子数（数字的平方根）开始判断是否能够取余
    //可以则循环取余直到取余不为0，因子个数+1；否则使用下一个因子计算；
    //最终整除了各个因子数之后剩余的数字不为1则本身也是一个因子，因此因子数+1
    public static void main1(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int num = scanner.nextInt();
            int ans = 0;//不同质因子的个数
            // 从2到n的平方根开始遍历因子
            for (int i = 2; i < Math.sqrt(num); i++) {
                if (num % i == 0) { // 不断地除这个因子直到不能整除为止，因子数加一，进入下一次循环
                    while (num % i == 0) {
                        num /= i;
                    }
                    ans++;
                }
            }
            if (num != 1) { // 当循环结束n不为1，即没能整除，说明此时的n也是一个因子
                ans++;
            }
            System.out.println(ans);
        }
    }

    //[编程题]最难的问题
    //密码字母：A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    //原文字母：V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
    //A-E替换成V-Z 而F-Z替换成A-U
    public static void main2(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            StringBuilder str = new StringBuilder();
            String s = scanner.nextLine();
            int length = s.length();
            for (int i = 0; i < length; i++) {
                if (s.charAt(i) >= 'A' && s.charAt(i) <= 'E') {
                    str.append((char) (s.charAt(i) + 21));
                } else if (s.charAt(i) > 'E' && s.charAt(i) <= 'Z') {
                    str.append((char) (s.charAt(i) - 5));
                } else if (s.charAt(i) == ' ') {
                    str.append(' ');
                }
            }
            System.out.println(str.toString());
        }
    }
    //2024. 考试的最大困扰度-滑动窗口
    //在指定字符的情况下，我们可以计算其最大连续数目。具体地，我们使用滑动窗口的方法，
    // 从左到右枚举右端点，维护区间中另一种字符的数量为sum，当sum 超过 k，我们需要让左端点右移，
    // 直到sum≤k。移动过程中，我们记录滑动窗口的最大长度，即为指定字符的最大连续数目。
    //本题的答案为分别指定字符为 T 和 F 时的最大连续数目的较大值

    public int maxConsecutiveAnswers(String answerKey, int k) {
        return Math.max(getMaxLength(answerKey, 'T', k),
                getMaxLength(answerKey, 'F', k));
    }
    //等价于求一个包含 'F' 或者 'T' 的个数不超过 k 的最大长度窗口
    //即当key=T 即求在answerKey这个字符串中最长的一组子串,该子串里包含T的数量要少于等于k个
    private int getMaxLength(String answerKey, char key, int k) {
        int length = answerKey.length();
        int cnt = 0;
        int ans = 0;
        //左右窗口，让r自增往右推
        for (int l = 0, r = 0; r < length; r++) {
            if (answerKey.charAt(r) == key) {
                cnt++;//记录key的个数
            }
            while (cnt > k){//当key的个数大于k时
                if (answerKey.charAt(l++) == key){
                    cnt--;//左窗口向右走;直到cnt<=k
                }
            }
            ans = Math.max(ans,r-l+1);
        }
        return ans;
    }
}
